home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 2003 August / MW 8 2003 CD1.iso / Inside Macworld / Product News / gimp-1.2.4.sit / gimp-1.2.4 / plug-ins / dbbrowser / dbbrowser_utils.c next >
Encoding:
C/C++ Source or Header  |  2002-11-15  |  24.0 KB  |  795 lines

  1. /* The GIMP -- an image manipulation program
  2.  * Copyright (C) 1995 Spencer Kimball and Peter Mattis
  3.  *
  4.  * This program is free software; you can redistribute it and/or modify
  5.  * it under the terms of the GNU General Public License as published by
  6.  * the Free Software Foundation; either version 2 of the License, or
  7.  * (at your option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17.  */
  18.  
  19. /* 
  20.  * dbbrowser_utils.c
  21.  * 0.08  26th sept 97  by Thomas NOEL <thomas@minet.net>
  22.  *
  23.  * 98/12/13  Sven Neumann <sven@gimp.org> : added help display
  24.  */
  25.  
  26. #include "config.h"
  27.  
  28. #include <string.h>
  29. #include <gtk/gtk.h>
  30.  
  31. #include <libgimp/gimp.h>
  32. #include <libgimp/gimpui.h>
  33.  
  34. #include "dbbrowser_utils.h"
  35.  
  36. #include "libgimp/stdplugins-intl.h"
  37.  
  38. /* configuration */
  39.  
  40. #define DBL_LIST_WIDTH 220
  41. #define DBL_WIDTH DBL_LIST_WIDTH+400
  42. #define DBL_HEIGHT 250
  43.  
  44. /* end of configuration */
  45.  
  46. typedef struct
  47. {
  48.   gchar *label;
  49.   gchar *func;
  50. } ListEntry_t;
  51.  
  52. typedef struct
  53. {
  54.   GtkWidget *dlg;
  55.  
  56.   GtkWidget *search_entry;
  57.   GtkWidget *name_button;
  58.   GtkWidget *blurb_button;
  59.  
  60.   GtkWidget *descr_scroll;
  61.   GtkWidget *descr_table;
  62.  
  63.   GtkWidget *clist;
  64.   GtkWidget *scrolled_win;
  65.  
  66.   /* the currently selected procedure */
  67.   gchar           *selected_proc_name;
  68.   gchar           *selected_scheme_proc_name;
  69.   gchar           *selected_proc_blurb;
  70.   gchar           *selected_proc_help;
  71.   gchar           *selected_proc_author;
  72.   gchar           *selected_proc_copyright;
  73.   gchar           *selected_proc_date;
  74.   GimpPDBProcType  selected_proc_type;
  75.   gint             selected_nparams;
  76.   gint             selected_nreturn_vals;
  77.   GimpParamDef    *selected_params;
  78.   GimpParamDef    *selected_return_vals; 
  79.  
  80.   void (* apply_callback) (gchar           *proc_name,
  81.                gchar           *scheme_proc_name,
  82.                gchar           *proc_blurb,
  83.                gchar           *proc_help,
  84.                gchar           *proc_author,
  85.                gchar           *proc_copyright,
  86.                gchar           *proc_date,
  87.                GimpPDBProcType  proc_type,
  88.                gint             nparams,
  89.                gint             nreturn_vals,
  90.                GimpParamDef    *params,
  91.                GimpParamDef    *return_vals);
  92.  
  93. } dbbrowser_t;
  94.  
  95. /* local functions */
  96.  
  97. static void    dialog_apply_callback     (GtkWidget      *widget,
  98.                       gpointer        data);
  99. static gint    procedure_select_callback (GtkWidget      *widget,
  100.                       gint            row,
  101.                       gint            column,
  102.                       GdkEventButton *bevent,
  103.                       gpointer        data);
  104. static void    dialog_search_callback    (GtkWidget      *widget, 
  105.                       gpointer        data);
  106. static void    dialog_select             (dbbrowser_t    *dbbrowser, 
  107.                       gchar          *proc_name);
  108. static void    dialog_close_callback     (GtkWidget      *widget, 
  109.                       gpointer        data);
  110. static void    convert_string            (gchar          *str);
  111. static gchar * GParamType2char           (GimpPDBArgType  t);
  112.  
  113. GList * proc_table = NULL;
  114.  
  115. /* create the dialog box
  116.  * console_entry != NULL => called from the script-fu-console
  117.  */
  118. GtkWidget *
  119. gimp_db_browser (void (* apply_callback) (gchar           *proc_name,
  120.                       gchar           *scheme_proc_name,
  121.                       gchar           *proc_blurb,
  122.                       gchar           *proc_help,
  123.                       gchar           *proc_author,
  124.                       gchar           *proc_copyright,
  125.                       gchar           *proc_date,
  126.                       GimpPDBProcType  proc_type,
  127.                       gint             nparams,
  128.                       gint             nreturn_vals,
  129.                       GimpParamDef    *params,
  130.                       GimpParamDef    *return_vals))
  131. {
  132.   dbbrowser_t* dbbrowser;
  133.   
  134.   GtkWidget *hbox;
  135.   GtkWidget *searchhbox;
  136.   GtkWidget *vbox;
  137.   GtkWidget *label;
  138.  
  139.   dbbrowser = g_new (dbbrowser_t, 1);
  140.   
  141.   dbbrowser->apply_callback = apply_callback;
  142.   
  143.   /* the dialog box */
  144.  
  145.   if (apply_callback)
  146.     {
  147.       dbbrowser->dlg =
  148.     gimp_dialog_new (_("DB Browser (init...)"), "dbbrowser",
  149.              gimp_standard_help_func, "filters/dbbrowser.html",
  150.              GTK_WIN_POS_MOUSE,
  151.              FALSE, TRUE, FALSE,
  152.  
  153.              _("Search by Name"), dialog_search_callback,
  154.              dbbrowser, NULL, &dbbrowser->name_button, TRUE, FALSE,
  155.              _("Search by Blurb"), dialog_search_callback,
  156.              dbbrowser, NULL, &dbbrowser->blurb_button, FALSE, FALSE,
  157.              _("Apply"), dialog_apply_callback,
  158.              dbbrowser, NULL, NULL, FALSE, FALSE,
  159.              _("Close"), dialog_close_callback,
  160.              dbbrowser, NULL, NULL, FALSE, TRUE,
  161.  
  162.              NULL);
  163.     }
  164.   else
  165.     {
  166.       dbbrowser->dlg =
  167.     gimp_dialog_new (_("DB Browser (init...)"), "dbbrowser",
  168.              gimp_standard_help_func, "filters/dbbrowser.html",
  169.              GTK_WIN_POS_MOUSE,
  170.              FALSE, TRUE, FALSE,
  171.  
  172.              _("Search by Name"), dialog_search_callback,
  173.              dbbrowser, NULL, &dbbrowser->name_button, TRUE, FALSE,
  174.              _("Search by Blurb"), dialog_search_callback,
  175.              dbbrowser, NULL, &dbbrowser->blurb_button, FALSE, FALSE,
  176.              _("Close"), dialog_close_callback,
  177.              dbbrowser, NULL, NULL, FALSE, TRUE,
  178.  
  179.              NULL);
  180.     }
  181.  
  182.   gtk_signal_connect (GTK_OBJECT (dbbrowser->dlg), "destroy",
  183.                       GTK_SIGNAL_FUNC (dialog_close_callback),
  184.                       dbbrowser);
  185.   
  186.   /* hbox : left=list ; right=description */
  187.   
  188.   hbox = gtk_hbox_new (FALSE, 0);
  189.   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dbbrowser->dlg)->vbox), 
  190.               hbox, TRUE, TRUE, 0);
  191.   gtk_widget_show (hbox);
  192.  
  193.   /* left = vbox : the list and the search entry */
  194.   
  195.   vbox = gtk_vbox_new (FALSE, 0);
  196.   gtk_container_set_border_width (GTK_CONTAINER (vbox), 3); 
  197.   gtk_box_pack_start (GTK_BOX (hbox), 
  198.               vbox, FALSE, TRUE, 0);
  199.   gtk_widget_show(vbox);
  200.   
  201.   /* list : list in a scrolled_win */
  202.   
  203.   dbbrowser->clist = gtk_clist_new (1);
  204.   dbbrowser->scrolled_win = gtk_scrolled_window_new (NULL, NULL);
  205.   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (dbbrowser->scrolled_win),
  206.                   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
  207.   gtk_clist_set_selection_mode (GTK_CLIST (dbbrowser->clist),
  208.                     GTK_SELECTION_BROWSE);
  209.  
  210.   gtk_widget_set_usize (dbbrowser->clist, DBL_LIST_WIDTH, DBL_HEIGHT);
  211.   gtk_signal_connect (GTK_OBJECT (dbbrowser->clist), "select_row",
  212.               (GtkSignalFunc) procedure_select_callback,
  213.               dbbrowser);
  214.   gtk_box_pack_start (GTK_BOX (vbox), dbbrowser->scrolled_win, TRUE, TRUE, 0);
  215.   gtk_container_add (GTK_CONTAINER (dbbrowser->scrolled_win), dbbrowser->clist);
  216.   gtk_widget_show (dbbrowser->clist);
  217.   gtk_widget_show (dbbrowser->scrolled_win);
  218.  
  219.   /* search entry */
  220.  
  221.   searchhbox = gtk_hbox_new (FALSE, 4);
  222.   gtk_box_pack_start (GTK_BOX (vbox),
  223.               searchhbox, FALSE, TRUE, 0);
  224.   gtk_widget_show (searchhbox);
  225.  
  226.   label = gtk_label_new (_("Search:"));
  227.   gtk_misc_set_alignment( GTK_MISC (label), 0.0, 0.5);
  228.   gtk_box_pack_start (GTK_BOX (searchhbox), 
  229.               label, TRUE, TRUE, 0);
  230.   gtk_widget_show (label);
  231.  
  232.   dbbrowser->search_entry = gtk_entry_new ();
  233.   gtk_signal_connect_object (GTK_OBJECT (dbbrowser->search_entry), "activate",
  234.                  GTK_SIGNAL_FUNC (gtk_window_activate_default),
  235.                  GTK_OBJECT (dbbrowser->dlg));
  236.   gtk_box_pack_start (GTK_BOX (searchhbox), 
  237.               dbbrowser->search_entry, TRUE, TRUE, 0);
  238.   gtk_widget_show(dbbrowser->search_entry);
  239.  
  240.   /* right = description */
  241.  
  242.   dbbrowser->descr_scroll = gtk_scrolled_window_new (NULL, NULL);
  243.   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (dbbrowser->descr_scroll),
  244.                   GTK_POLICY_ALWAYS, 
  245.                   GTK_POLICY_ALWAYS);
  246.   gtk_box_pack_start (GTK_BOX (hbox), 
  247.               dbbrowser->descr_scroll, TRUE, TRUE, 0);
  248.   gtk_widget_set_usize (dbbrowser->descr_scroll, DBL_WIDTH - DBL_LIST_WIDTH, 0);
  249.   gtk_widget_show (dbbrowser->descr_scroll);
  250.  
  251.   /* now build the list */
  252.  
  253.   gtk_widget_show (dbbrowser->clist); 
  254.   gtk_widget_show (dbbrowser->dlg);
  255.  
  256.   /* initialize the "return" value (for "apply") */
  257.  
  258.   dbbrowser->descr_table = NULL;
  259.   dbbrowser->selected_proc_name = NULL;
  260.   dbbrowser->selected_scheme_proc_name = NULL;
  261.   dbbrowser->selected_proc_blurb = NULL;
  262.   dbbrowser->selected_proc_help = NULL;
  263.   dbbrowser->selected_proc_author = NULL;
  264.   dbbrowser->selected_proc_copyright = NULL;
  265.   dbbrowser->selected_proc_date = NULL;
  266.   dbbrowser->selected_proc_type = 0;
  267.   dbbrowser->selected_nparams = 0;
  268.   dbbrowser->selected_nreturn_vals = 0;
  269.   dbbrowser->selected_params = NULL;
  270.   dbbrowser->selected_return_vals = NULL;
  271.  
  272.   /* first search (all procedures) */
  273.   dialog_search_callback (NULL, (gpointer) dbbrowser);
  274.  
  275.   return dbbrowser->dlg;
  276. }
  277.  
  278. static gint
  279. procedure_select_callback (GtkWidget      *widget,
  280.                gint            row,
  281.                gint            column,
  282.                GdkEventButton *bevent,
  283.                gpointer        data)
  284. {
  285.   dbbrowser_t *dbbrowser = data;
  286.   gchar *func;
  287.  
  288.   g_return_val_if_fail (widget != NULL, FALSE);
  289.   /*  g_return_val_if_fail (bevent != NULL, FALSE);  */
  290.   g_return_val_if_fail (dbbrowser != NULL, FALSE);
  291.  
  292.   if ((func = (gchar *) (gtk_clist_get_row_data (GTK_CLIST (widget), row))))
  293.     dialog_select (dbbrowser, func);
  294.   return FALSE;
  295. }
  296.  
  297. /* update the description box (right) */
  298. static void 
  299. dialog_select (dbbrowser_t *dbbrowser, 
  300.            gchar       *proc_name)
  301. {
  302.   GtkWidget *label;
  303.   GtkWidget *old_table;
  304.   GtkWidget *help;
  305.   GtkWidget *text = NULL;
  306.   GtkWidget *vscrollbar;
  307.   gint i, row = 0;
  308.  
  309.   g_free (dbbrowser->selected_proc_name);
  310.   dbbrowser->selected_proc_name = g_strdup (proc_name);
  311.  
  312.   g_free (dbbrowser->selected_scheme_proc_name);
  313.   dbbrowser->selected_scheme_proc_name = g_strdup (proc_name);
  314.   convert_string (dbbrowser->selected_scheme_proc_name);
  315.  
  316.   g_free (dbbrowser->selected_proc_blurb);
  317.   g_free (dbbrowser->selected_proc_help);
  318.   g_free (dbbrowser->selected_proc_author);
  319.   g_free (dbbrowser->selected_proc_copyright);
  320.   g_free (dbbrowser->selected_proc_date);
  321.   g_free (dbbrowser->selected_params);
  322.   g_free (dbbrowser->selected_return_vals);
  323.  
  324.   gimp_procedural_db_proc_info (proc_name, 
  325.                 &(dbbrowser->selected_proc_blurb), 
  326.                 &(dbbrowser->selected_proc_help), 
  327.                 &(dbbrowser->selected_proc_author),
  328.                 &(dbbrowser->selected_proc_copyright), 
  329.                 &(dbbrowser->selected_proc_date), 
  330.                 &(dbbrowser->selected_proc_type), 
  331.                 &(dbbrowser->selected_nparams),
  332.                 &(dbbrowser->selected_nreturn_vals), 
  333.                 &(dbbrowser->selected_params), 
  334.                 &(dbbrowser->selected_return_vals));
  335.   
  336.   /* save the "old" table */
  337.   old_table = dbbrowser->descr_table;
  338.  
  339.   dbbrowser->descr_table = gtk_table_new
  340.     (10 + dbbrowser->selected_nparams + dbbrowser->selected_nreturn_vals,
  341.      5, FALSE);
  342.  
  343.   gtk_table_set_col_spacings (GTK_TABLE (dbbrowser->descr_table), 4);
  344.  
  345.   /* show the name */
  346.  
  347.   label = gtk_label_new (_("Name:"));
  348.   gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  349.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  350.             0, 1, row, row+1, GTK_FILL, GTK_FILL, 3, 6);
  351.   gtk_widget_show (label);
  352.  
  353.   label = gtk_entry_new ();
  354.   gtk_entry_set_text (GTK_ENTRY (label), dbbrowser->selected_scheme_proc_name);
  355.   gtk_entry_set_editable (GTK_ENTRY (label), FALSE);
  356.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  357.             1, 4, row, row+1, GTK_FILL, GTK_FILL, 0, 0);
  358.   gtk_widget_show (label);
  359.   row++;
  360.  
  361.   /* show the description */
  362.  
  363.   label = gtk_label_new (_("Blurb:"));
  364.   gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  365.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  366.             0, 1, row, row+1, GTK_FILL, GTK_FILL, 3, 0);
  367.   gtk_widget_show (label);
  368.  
  369.   label = gtk_label_new (dbbrowser->selected_proc_blurb);
  370.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  371.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  372.             1, 4, row, row+1, GTK_FILL, GTK_FILL, 0, 0);
  373.   gtk_widget_show (label);
  374.   row++;
  375.  
  376.   label = gtk_hseparator_new (); /* ok, not really a label ... :) */
  377.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  378.             0, 4, row, row+1, GTK_FILL, GTK_FILL, 3, 6);
  379.   gtk_widget_show (label);
  380.   row++;
  381.  
  382.   /* in parameters */
  383.   if (dbbrowser->selected_nparams) 
  384.     {
  385.       label = gtk_label_new (_("In:"));
  386.       gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.0); 
  387.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  388.             0, 1, row, row+(dbbrowser->selected_nparams), 
  389.             GTK_FILL, GTK_FILL, 3, 0);
  390.       gtk_widget_show (label);
  391.       for (i = 0; i < dbbrowser->selected_nparams; i++) 
  392.     {
  393.       /* name */
  394.       label = gtk_label_new ((dbbrowser->selected_params[i]).name);
  395.       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); 
  396.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  397.                 1, 2, row, row+1, GTK_FILL, GTK_FILL, 0, 0);
  398.       gtk_widget_show (label);
  399.  
  400.       /* type */
  401.       label = gtk_label_new (GParamType2char ((dbbrowser->selected_params[i]).type));
  402.       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  403.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  404.                 2, 3, row, row+1, GTK_FILL, GTK_FILL, 0, 0);
  405.       gtk_widget_show (label);
  406.  
  407.       /* description */
  408.       label = gtk_label_new ((dbbrowser->selected_params[i]).description);
  409.       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
  410.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  411.                 3, 4, row, row+1, GTK_FILL, GTK_FILL, 0, 0);
  412.       gtk_widget_show (label);
  413.       
  414.       row++;
  415.     }
  416.     }
  417.  
  418.   if ((dbbrowser->selected_nparams) && 
  419.       (dbbrowser->selected_nreturn_vals))
  420.     {
  421.       label = gtk_hseparator_new (); /* ok, not really a label ... :) */
  422.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  423.             0, 4, row, row+1,
  424.             GTK_FILL, GTK_FILL, 3, 6);
  425.       gtk_widget_show (label);
  426.       row++;
  427.     }
  428.  
  429.   /* out parameters */
  430.   if (dbbrowser->selected_nreturn_vals)
  431.     {
  432.       label = gtk_label_new (_("Out:"));
  433.       gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.0); 
  434.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  435.             0, 1, row, row+(dbbrowser->selected_nreturn_vals), 
  436.             GTK_FILL, GTK_FILL, 3, 0);
  437.       gtk_widget_show (label);
  438.       for (i = 0; i < dbbrowser->selected_nreturn_vals; i++) 
  439.     {
  440.       /* name */
  441.       label = gtk_label_new ((dbbrowser->selected_return_vals[i]).name);
  442.       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); 
  443.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  444.                 1, 2, row, row+1, 
  445.                 GTK_FILL, GTK_FILL, 0, 0);
  446.       gtk_widget_show (label);
  447.  
  448.       /* type */
  449.       label = gtk_label_new (GParamType2char((dbbrowser->selected_return_vals[i]).type));
  450.       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  451.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  452.                 2, 3, row, row+1, 
  453.                 GTK_FILL, GTK_FILL, 0, 0);
  454.       gtk_widget_show (label);
  455.  
  456.       /* description */
  457.       label = gtk_label_new ((dbbrowser->selected_return_vals[i]).description);
  458.       gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); 
  459.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  460.                 3, 4, row, row+1, 
  461.                 GTK_FILL, GTK_FILL, 0, 0);
  462.       gtk_widget_show (label);
  463.       row++;
  464.     }
  465.     }
  466.  
  467.   if ((dbbrowser->selected_nparams) || 
  468.       (dbbrowser->selected_nreturn_vals))
  469.     {
  470.       label = gtk_hseparator_new (); /* ok, not really a label ... :) */
  471.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  472.             0, 4, row, row+1,
  473.             GTK_FILL, GTK_FILL, 3, 6);
  474.       gtk_widget_show (label);
  475.     row++;
  476.   }
  477.  
  478.   /* show the help */
  479.   if ((dbbrowser->selected_proc_help) &&
  480.       (strlen (dbbrowser->selected_proc_help) > 1))
  481.     {
  482.       label = gtk_label_new (_("Help:"));
  483.       gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.0); 
  484.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  485.             0, 1, row, row+1, 
  486.             GTK_FILL, GTK_FILL, 3, 0);
  487.       gtk_widget_show (label);
  488.  
  489.       help = gtk_table_new (2, 2, FALSE);
  490.       gtk_table_set_row_spacing (GTK_TABLE (help), 0, 2);
  491.       gtk_table_set_col_spacing (GTK_TABLE (help), 0, 2);
  492.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), help,
  493.             1, 4, row, row+1, 
  494.                         GTK_FILL | GTK_EXPAND, GTK_FILL | GTK_EXPAND, 3, 0);
  495.       gtk_widget_show (help);
  496.       row++;
  497.       
  498.       text = gtk_text_new (NULL, NULL);
  499.       gtk_text_set_editable (GTK_TEXT (text), FALSE);
  500.       gtk_text_set_word_wrap (GTK_TEXT (text), TRUE);
  501.       gtk_widget_set_usize (text, -1, 60);
  502.       gtk_table_attach (GTK_TABLE (help), text, 0, 1, 0, 1,
  503.             GTK_EXPAND | GTK_SHRINK | GTK_FILL,
  504.             GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  505.       gtk_widget_show (text);
  506.       
  507.       vscrollbar = gtk_vscrollbar_new (GTK_TEXT (text)->vadj);
  508.       gtk_table_attach (GTK_TABLE (help), vscrollbar, 1, 2, 0, 1,
  509.             GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  510.       gtk_widget_show (vscrollbar);
  511.  
  512.       label = gtk_hseparator_new (); /* ok, not really a label ... :) */
  513.       gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  514.             0, 4, row, row+1, GTK_FILL, GTK_FILL, 3, 6);
  515.       gtk_widget_show (label);
  516.       row++;
  517.     }
  518.  
  519.   /* show the author & the copyright */
  520.  
  521.   label = gtk_label_new (_("Author:"));
  522.   gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  523.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  524.             0, 1, row, row+1, 
  525.             GTK_FILL, GTK_FILL, 3, 0);
  526.   gtk_widget_show (label);
  527.  
  528.   label = gtk_label_new (dbbrowser->selected_proc_author);
  529.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  530.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  531.             1, 4,  row, row+1,
  532.             GTK_FILL, GTK_FILL, 0, 0);
  533.   gtk_widget_show (label);
  534.   row++;
  535.  
  536.   label = gtk_label_new (_("Date:"));
  537.   gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  538.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  539.             0, 1, row, row+1, 
  540.             GTK_FILL, GTK_FILL, 3, 0);
  541.   gtk_widget_show (label);
  542.  
  543.   label = gtk_label_new (dbbrowser->selected_proc_date);
  544.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  545.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  546.             1, 4,  row, row+1,
  547.             GTK_FILL, GTK_FILL, 0, 0);
  548.   gtk_widget_show (label);
  549.   row++;
  550.  
  551.   label = gtk_label_new (_("Copyright:"));
  552.   gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5); 
  553.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  554.             0, 1, row, row+1, 
  555.             GTK_FILL, GTK_FILL, 3, 0);
  556.   gtk_widget_show (label);
  557.  
  558.   label = gtk_label_new (dbbrowser->selected_proc_copyright);
  559.   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
  560.   gtk_table_attach (GTK_TABLE (dbbrowser->descr_table), label,
  561.             1, 4,  row, row+1,
  562.             GTK_FILL, GTK_FILL, 0, 0);
  563.   gtk_widget_show (label);
  564.   row++;
  565.  
  566.   if (old_table)
  567.     gtk_widget_destroy (old_table);
  568.  
  569.   gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (dbbrowser->descr_scroll), 
  570.                      dbbrowser->descr_table);
  571.  
  572.   /* now after the table is added to a window add the text */
  573.   if (text != NULL)
  574.     {
  575.       gtk_widget_realize (text);
  576.       gtk_text_freeze (GTK_TEXT (text));
  577.       gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL,
  578.                dbbrowser->selected_proc_help, -1);
  579.       gtk_text_thaw (GTK_TEXT (text));
  580.     }
  581.   gtk_widget_show (dbbrowser->descr_table);
  582. }
  583.  
  584. /* end of the dialog */
  585. static void
  586. dialog_close_callback (GtkWidget *widget, 
  587.                gpointer   data)
  588. {
  589.   dbbrowser_t* dbbrowser = data;
  590.  
  591.   if (dbbrowser->apply_callback)
  592.     {
  593.       /* we are called by another application : just kill the dialog box */
  594.       gtk_widget_hide (dbbrowser->dlg);
  595.       gtk_widget_destroy (dbbrowser->dlg);
  596.     }
  597.   else
  598.     {
  599.       /* we are in the plug_in : kill the gtk application */
  600.       gtk_widget_destroy (dbbrowser->dlg);
  601.       gtk_main_quit ();
  602.     }
  603. }
  604.  
  605. /* end of the dialog */
  606. static void 
  607. dialog_apply_callback (GtkWidget *widget, 
  608.                gpointer   data)
  609. {
  610.   dbbrowser_t* dbbrowser = data;
  611.  
  612.   (dbbrowser->apply_callback) (dbbrowser->selected_proc_name,
  613.                    dbbrowser->selected_scheme_proc_name,
  614.                    dbbrowser->selected_proc_blurb,
  615.                    dbbrowser->selected_proc_help,
  616.                    dbbrowser->selected_proc_author,
  617.                    dbbrowser->selected_proc_copyright,
  618.                    dbbrowser->selected_proc_date,
  619.                    dbbrowser->selected_proc_type,
  620.                    dbbrowser->selected_nparams,
  621.                    dbbrowser->selected_nreturn_vals,
  622.                    dbbrowser->selected_params,
  623.                    dbbrowser->selected_return_vals);
  624. }
  625.  
  626. /* search in the whole db */
  627. static void 
  628. dialog_search_callback (GtkWidget *widget, 
  629.             gpointer   data)
  630. {
  631.   gchar **proc_list;
  632.   gint num_procs;
  633.   gint i, j;
  634.   dbbrowser_t* dbbrowser = data;
  635.   gchar *func_name, *label, *query_text;
  636.   GString *query;
  637.  
  638.   gtk_clist_freeze (GTK_CLIST (dbbrowser->clist));
  639.   gtk_clist_clear (GTK_CLIST (dbbrowser->clist));
  640.  
  641.   /* search */
  642.  
  643.   if (widget == (dbbrowser->name_button))
  644.     {
  645.       gtk_window_set_title (GTK_WINDOW (dbbrowser->dlg), 
  646.                 _("DB Browser (by name - please wait)"));
  647.  
  648.       query = g_string_new ("");
  649.       query_text = gtk_entry_get_text (GTK_ENTRY (dbbrowser->search_entry));
  650.  
  651.       while (*query_text)
  652.     {
  653.       if ((*query_text == '_') || (*query_text == '-'))
  654.         g_string_append (query, "[-_]");
  655.       else
  656.         g_string_append_c (query, *query_text);
  657.  
  658.       query_text++;
  659.     }
  660.  
  661.       gimp_procedural_db_query (query->str,
  662.                     ".*", ".*", ".*", ".*", ".*", ".*", 
  663.                     &num_procs, &proc_list);
  664.  
  665.       g_string_free (query, TRUE);
  666.     }
  667.   else if (widget == (dbbrowser->blurb_button))
  668.     {
  669.       gtk_window_set_title (GTK_WINDOW (dbbrowser->dlg), 
  670.                 _("DB Browser (by blurb - please wait)"));
  671.       gimp_procedural_db_query (".*", 
  672.                     gtk_entry_get_text(
  673.                   GTK_ENTRY(dbbrowser->search_entry) ),
  674.                     ".*", ".*", ".*", ".*", ".*",
  675.                     &num_procs, &proc_list);
  676.     }
  677.   else
  678.     {
  679.       gtk_window_set_title (GTK_WINDOW (dbbrowser->dlg), 
  680.                 _("DB Browser (please wait)"));
  681.       gimp_procedural_db_query (".*", ".*", ".*", ".*", ".*", ".*", ".*", 
  682.                     &num_procs, &proc_list);
  683.     }
  684.  
  685.   for (i = 0; i < num_procs; i++)
  686.     {
  687.       j = 0;
  688.       while ((j < i) &&
  689.          (strcmp (gtk_clist_get_row_data (GTK_CLIST (dbbrowser->clist), j),
  690.               proc_list[i]) < 0))
  691.     j++;
  692.  
  693.       label = g_strdup (proc_list[i]);
  694.       convert_string (label);
  695.       gtk_clist_insert (GTK_CLIST (GTK_CLIST(dbbrowser->clist)), j,
  696.             &label);
  697.       func_name = g_strdup (proc_list[i]);
  698.  
  699.       gtk_clist_set_row_data_full (GTK_CLIST (dbbrowser->clist), j,
  700.                    func_name, g_free);
  701.     }
  702.  
  703.   if (num_procs > 0)
  704.     {
  705.       dialog_select (dbbrowser,
  706.              gtk_clist_get_row_data (GTK_CLIST (dbbrowser->clist), 0));
  707.       gtk_clist_select_row (GTK_CLIST (dbbrowser->clist), 0, 0);
  708.     }
  709.  
  710.   /*
  711.   if (num_procs != 0) {
  712.     gchar *insert_name, *label_name;
  713.     int i,j,savej;
  714.     
  715.     for (i = 0; i < num_procs ; i++) {
  716.  
  717.       insert_name=g_strdup(proc_list[0]); savej=0;
  718.       for (j = 0; j < num_procs ; j++) {
  719.     if (strcmp(proc_list[j],insert_name)<0) {
  720.       g_free(insert_name);
  721.       insert_name=g_strdup(proc_list[j]);
  722.       savej=j;
  723.     }
  724.       }
  725.   
  726.       proc_list[savej][0]='\255';
  727.  
  728.       label_name = g_strdup( insert_name );
  729.       convert_string( label_name );
  730.       gtk_clist_append (GTK_CLIST (dbbrowser->clist), &label_name);
  731.  
  732.       if (i==0) dialog_select( dbbrowser , insert_name );
  733.  
  734.       g_free(label_name);
  735.     }
  736.   }
  737.   */
  738.   
  739.   if (dbbrowser->clist)
  740.     {
  741.       ;
  742.     }
  743.   
  744.   g_free (proc_list);
  745.  
  746.   gtk_window_set_title (GTK_WINDOW (dbbrowser->dlg), _("DB Browser"));
  747.   gtk_clist_thaw (GTK_CLIST (dbbrowser->clist));
  748.  
  749. }
  750.  
  751. /* utils ... */
  752.  
  753. static void 
  754. convert_string (gchar *str)
  755. {
  756.   while (*str)
  757.     {
  758.       if (*str == '_') *str = '-';
  759.       str++;
  760.     }
  761. }
  762.  
  763. static gchar * 
  764. GParamType2char (GimpPDBArgType t)
  765. {
  766.   switch (t)
  767.     {
  768.     case GIMP_PDB_INT32: return "INT32";
  769.     case GIMP_PDB_INT16: return "INT16";
  770.     case GIMP_PDB_INT8: return "INT8";
  771.     case GIMP_PDB_FLOAT: return "FLOAT";
  772.     case GIMP_PDB_STRING: return "STRING";
  773.     case GIMP_PDB_INT32ARRAY: return "INT32ARRAY";
  774.     case GIMP_PDB_INT16ARRAY: return "INT16ARRAY";
  775.     case GIMP_PDB_INT8ARRAY: return "INT8ARRAY";
  776.     case GIMP_PDB_FLOATARRAY: return "FLOATARRAY";
  777.     case GIMP_PDB_STRINGARRAY: return "STRINGARRAY";
  778.     case GIMP_PDB_COLOR: return "COLOR";
  779.     case GIMP_PDB_REGION: return "REGION";
  780.     case GIMP_PDB_DISPLAY: return "DISPLAY";
  781.     case GIMP_PDB_IMAGE: return "IMAGE";
  782.     case GIMP_PDB_LAYER: return "LAYER";
  783.     case GIMP_PDB_CHANNEL: return "CHANNEL";
  784.     case GIMP_PDB_DRAWABLE: return "DRAWABLE";
  785.     case GIMP_PDB_SELECTION: return "SELECTION";
  786.     case GIMP_PDB_BOUNDARY: return "BOUNDARY";
  787.     case GIMP_PDB_PATH: return "PATH";
  788.     case GIMP_PDB_PARASITE: return "PARASITE";
  789.     case GIMP_PDB_STATUS: return "STATUS";
  790.     case GIMP_PDB_END: return "END";
  791.     }
  792.   
  793.   return "UNKNOWN";
  794. }
  795.